<?php

namespace App\Models;

use App\User;
use Illuminate\Database\Eloquent\Model;

class ArticleModel extends Model
{
    protected $fillable=[
        'user_id','title','source','author','description','category_id','thumb','content','redirect_id','clicks','fields'
    ];
    //通过casts字符类型转换指定文章表中的fields字段对应的类型
    protected  $casts = [
        'fields'=>'array',
    ];

    public function getextendField(CategoryModel $categorymodel ){
        //上面通过类型指定,指出调用当前函数的时候要传递过来一个栏目模型对象
        //通过调用category栏目对象中的contentModel方法来获取当前栏目对应模型的fields字段中的值
        $fields =  $categorymodel->contentModel->fields;
        $html = '';
//        $fields是一个二维数组,使用foreach遍历这个二维数组
        foreach ($fields as $field){
             $html .= view('content.fields.'.$field['type'],['field'=>$field,'article'=>$this['fields']]);
        }

        return $html;
    }


//文章表和栏目表关联方法
    public function category(){
//        下面这句是让文章表和栏目表进行关联,关联使用belongTo(要关联到的模型)方法进行关联,文章表和栏目表是多对一的关系,关联的时候可以指定用哪个键进行关联,如果没有指定的话laravel默认用当前方法名+'_id'(这里为category_id)进行关联
        return $this->belongsTo(CategoryModel::class);
    }
//文章表和用户表关联方法
    public function user(){
        return $this->belongsTo(User::class);
    }

//    获取文章表模板的方法
    public function getTemplateAttribute(){
//        return $this['article_templated']??$this->category->'content_template';
        //上面那一行是我写的有2个错误
        //$this代表当前文章.在Content中的HomeController控制器的content方法中,当用户要展示某篇文章的时候,content方法会通过依赖注入的方式获取当前要展示文章的实例,然后该实例调用getTemplateAttribute方法,所以这个时候的$this其实就是调用这个方法的需要展示的那个文章对象实例.
        //判断当前文章实例的article_templdate属性是否为null,如果为null的话就用当前文章对应栏目中的content_template属性的值作为这篇文章的模板
        return $this->article_template??$this->category->content_template;
    }
}
